package com.itheima.pinda.file.biz;

import cn.hutool.core.util.StrUtil;
import com.itheima.pinda.file.domain.FileDO;
import com.itheima.pinda.file.enumeration.DataType;
import com.itheima.pinda.file.utils.ZipUtils;
import com.itheima.pinda.utils.NumberHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 吴向明
 * @Date: 2021/09/14/9:52
 * @Description:提供文件下载的公共方法
 */

@Component
@Slf4j
public class FileBiz {
    /**
     * 防止下载多个文件的原始名称重复,构建新的文件名
     *
     * @param fileName
     * @param order
     * @return
     */
    private static String buildNewFileName(String fileName, Integer order) {
        return StrUtil.strBuilder(fileName).insert(fileName.lastIndexOf("."), "(" + order + ")").toString();
    }

    /**
     * 文件下载方法
     *
     * @param fileDOList
     * @param request
     * @param response
     */
    public void down(List<FileDO> fileDOList, HttpServletRequest request, HttpServletResponse response) throws Exception {
        int fileSize = fileDOList.stream().filter(         //将fileDOList进行过滤
                (file) -> file != null &&
                        !file.getDataType().eq(DataType.DIR) &&
                        StringUtils.isNotEmpty(file.getUrl())).mapToInt(    //将文件大小转为int类型
                (file) -> NumberHelper.intValueOf0(file.getSize()
                )).sum();//计算下载的总文件大小

        //确定要下载的文件名称
        String downLoadFileName = fileDOList.get(0).getSubmittedFileName();
        if (fileDOList.size() > 1) {
            //要下载多个文件,生成一个zip压缩文件名称
            downLoadFileName = StringUtils.substring(downLoadFileName, 0, StringUtils.lastIndexOf(downLoadFileName, ".")) + "等.zip";
        }
        //key是文件名,value是url
        Map<String, String> fileMap = new LinkedHashMap<>();

        //处理下载文件名称同名情况
        Map<String, Integer> duplicateFile = new HashMap<>(fileDOList.size());

        //fileDOList ===> Map<String,String>
        fileDOList.stream().filter((file) -> file != null &&
                !file.getDataType().eq(DataType.DIR) &&
                StringUtils.isNotEmpty(file.getUrl())).forEach((file) -> {
            String submittedFileName = file.getSubmittedFileName();

            if (fileMap.containsKey(submittedFileName)) {
                if (duplicateFile.containsKey(submittedFileName)) {
                    //将重复的文件名次数加1
                    duplicateFile.put(submittedFileName, duplicateFile.get(submittedFileName) + 1);
                } else {
                    duplicateFile.put(submittedFileName, 1);
                }
                submittedFileName = buildNewFileName(submittedFileName, duplicateFile.get(submittedFileName));
            }
            fileMap.put(submittedFileName, file.getUrl());
        });

        ZipUtils.zipFilesByInputStream(fileMap, Long.valueOf(fileSize), downLoadFileName, request, response);
    }
}
